//
//  ViewController.m
//  iOSnetworkLessonFour
//
//  Created by lcy on 16/1/11.
//  Copyright © 2016年 lcy. All rights reserved.
//

#import "ViewController.h"
#import "GDataXMLNode.h"

@interface ViewController () <NSXMLParserDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    // 读入文件
    NSString *path = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"xml"];
    
    // NSXMLParser对象
//    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:path]];
//    
//    // 设置delegate对象（解析过程放在代理中执行）
//    parser.delegate = self;
//    
//    // 执行解析
//    [parser parse];
    
    // sax解析的优点：逐行解析，不会一次性读入整个文件，减小内存消耗。因为是逐行解析，xml文件损坏对解析没影响
    // sax解析的缺点：因为是逐行解析，所以没办法获取文件的层级关系，对于程序员获取数据而言比较麻烦
    
    // DOM解析:一次性读入整个文档进行解析
    
    /********************************DOM*******************************/
    // 获取文件路径
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    
    NSError *error;
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:str options:0 error:&error];
    
    // 获取根节点
    // 不断的找子节点来获取数据
    
//        GDataXMLElement *rootElement = document.rootElement;
//        NSLog(@"%@", rootElement);
//    // 获取子节点
//        NSArray *array = rootElement.children;
//        NSLog(@"%@", array[1]);
//    
//    // 获取子节点的子节点
//    
//        GDataXMLElement *childElement = array[1];
//        GDataXMLElement *element = childElement.children[1];
//        NSLog(@"%@", element);
//        NSString *sex = element.stringValue;
//        NSLog(@"%@", sex);
    
    // 第二种方式：使用elementForName：方法，给出一个节点的名字然后获取节点对应的数据
    
//    GDataXMLElement *rootelement = document.rootElement;
//    NSArray *arr = [rootelement elementsForName:@"teacher"];
//    NSLog(@"%@", arr[1]);
//    GDataXMLElement *element = arr[1];
//    GDataXMLElement *sex = [element elementsForName:@"sex"][0];
//    NSLog(@"%@", sex.stringValue);
    
    // 第三种方式，通过绝对路径
//    NSArray *array = [document nodesForXPath:@"teachers/teacher/sex" error:nil];
//    NSLog(@"%@", [array[1] stringValue]);
    
    // 第四种方法，通过相对路径
    NSArray *array = [document nodesForXPath:@"//age" error:nil];
    NSLog(@"%@", [array[2] stringValue]);
    
    // DOM解析的优缺点：优点，一次性读入整个文件，会把文件的树形结构纪录下来，有利于程序员分析数据。XML文件一旦出错，会立即发现错误。缺点，一次性加载整个文件，对内存需求大，同时优点也是缺点，即XML文件出现错误，就无法解析数据。
    // 原理：遇到开标签入栈，遇到关标签出栈
}

// 开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"%@", elementName);
}

// 结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"%@", elementName);
}

// 取值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"%@", string);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
